package com.zp.self.module.level_4_算法练习.算法.双指针.左右指针;

/**
 * @author By ZengPeng
 */
public class 力扣_283_移动零 {
    //测试
    public static void main(String[] args) {
//        int[] ints = {7, 1, 5, 0, 3, 6, 4};
        int[] ints = {0,0,1};
        new 力扣_283_移动零().moveZeroes(ints);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }

    /**
     * 题目：给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
     * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
     *
     *
     * 分析：
     *      1.直接创建个数组，不为0 添加-- 但不符合题目要求
     *      2.双重fot循环 ，将0沉到末尾    会有遗漏 -.-
     *      大神：双指针
     *
     * 边界值注意：
     *      1. {0,0,1};  位移之后，当前位还是0  需要再次判断
     **/
    //双重for冒泡
    public void moveZeroesG(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]==0){
                for (int j = i+1; j < nums.length; j++) {
                    nums[j]= nums[j] ^nums[j-1];
                    nums[j-1]= nums[j] ^nums[j-1];
                    nums[j]= nums[j] ^nums[j-1];
                }
            }
        }
    }
    //  大神：双指针 0,0,1};
    public void moveZeroes(int[] nums) {
        //第一次遍历的时候，j指针记录非0的个数，只要是非0的统统都赋给nums[j]
        int j = 0;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        //非0元素统计完了，剩下的都是0了
        //所以第二次遍历把末尾的元素都赋为0即可
        for (int i = j; i < nums.length; ++i) {
            nums[i] = 0;
        }
    }
}
